/**
 * 这是专门写权限的文件，比如写导航守卫那些
 */
import router from './router'
import store from './store'
// 导入NProgress
import nprogress from 'nprogress'
// 导入他的样式
import 'nprogress/nprogress.css'

// 导入全部的动态路由
import { aysncRoutes } from '@/router'


/**
 * to：  去哪
 * from: 从哪来
 * next：放行的函数，调用就代表放行，不调用就是不放行
 * 
 * 路由白名单：
 *  设置一些页面不需要做token的判断，例如登录需要判断有没有token吗？
 *  上一个项目通过路由元信息来判断的
 *  白名单本质上就是一个数组，数组里有不需要token就能访问的页面的路径
 * 
 */

//  设置路由白名单
let whiteList = ['/login', '/404']
router.beforeEach(async (to, from, next) => {

  // 准备跳转时要出进度条
  nprogress.start()

  // 判断是否有token
  if (store.getters.token) {
    // 登录了
    // 还要判断是不是去的登录页
    if (to.path === '/login') {
      // 放行到首页
      next('/')
    } else {

      // 如果没有数据才发请求
      if (!store.getters.userId) {
        // 在这里获取用户信息
        let userInfo = await store.dispatch('user/getUserInfo')

        // 我们就应该在这里根据menus来分配路由
        // console.log(userInfo.roles.menus)
        // 把它对应拥有的路由对象加到路由规则里
        // 这里的item就是每个路由对象，路由对象里有name属性
        // 那么根据name属性，判断在不在menus里面，在就提取出来
        let routes = await store.dispatch('permission/getAsyncRoutes', userInfo.roles.menus)
        
        // 把筛选出来的路由对象，加到路由规则里
        // 给路由对象添加路由规则（添加的一堆规则，既然是一堆规则就是一个数组
        // 添加好那些路由就代表给你铺了一些到那些页面的路
        // 铺路需要一丢丢时间，所以如果addRoutes后立即next，放行不过去
        router.addRoutes(routes)
        // 解决办法就是这次先不去，下次一定
        next(to.path) // 跟next()区别在于，next()这次就要去，next(to.path)相当于先回来下次再去
      }
      // 既登录了而且去的也不是登录页，就正常放行
      // 就证明这里就是去后台的任何一个页面，不管去哪个页面都需要有用户信息
      next()
    }
  } else {

    // 判断要去的路由在不在白名单里面
    if (whiteList.includes(to.path)) {

      next()

    } else {

      // 没有登录，打回登录页
      next('/login')
    }
  }
})


// 路由跳转之后
router.afterEach((to, from) => {

  // 停止进度条
  nprogress.done()
})